# include <stdio.h>
# include <math.h>
# include <malloc.h>
# include <stdlib.h>
# define PI 3.14

/* 函数定义区 */
void f(float *r, int Fm, int L, float dt); 
float * h_Ip(float *pRaa1, int leng_1, float *pRaa2, int leng_2);

void main()
{
	float R[71]; //用是存放生成的数据
	int i;	//用来循环的量
	int L = 71; //子波长度 
	float dt = 0.001;	//采样间隔
	int Fm = 10;	//子波的中心频率
	FILE * fp; //定义一个文件类指针

	f(R, Fm, L, dt); //调用函数
	
	/* 打开文件并判断 */
	if((fp=fopen("data.txt","w")) == NULL) 
	{
		perror("data.txt");
		exit(1);
	}
	
	/* 向文件输出 */
	for(i=0; i<71; i++)
	{
		fprintf(fp, "%f\n", R[i]);
	}

	fclose(fp); //关闭文件
}


void f(float *r, int Fm, int L, float dt) //雷克子函数
{
	int *I; //I是时间间隔点
	float *t;
	int i;

	/* 动态分配内存 */
	t = (float *)malloc(sizeof(float) * L);
	I = (int *)malloc(sizeof(int) * L); 
	
	/* 为时间间隔点赋值 从0~70 */
	for(i=0; i<L; i++)
	{
		I[i] = i;
	}
	/* 通过t = i * dt的公式计算   */
	for(i=0; i<L; i++)
	{
		t[i] = dt * I[i];
	}
	/*  通过计算r(t)的公式计算  并将值保存在R[]中 */
	for(i=0; i<L; i++)
	{
		r[i] = (exp(-1*pow(PI*Fm*t[i], 2))) * (1 - 2*pow(PI*Fm*t[i], 2));
	}

	/* 释放内存 */
	free(t);
	free(I);
}

/* 一维离散卷积公式 */
/* 用于计算(pRaa1[leng_1] * pRaa2[leng_2])[leng_3] */
float * h_Ip(float *pRaa1, int leng_1, float *pRaa2, int leng_2) //leng_1是1数组的长度，leng_2是2数组的长度,*pRaa3用来储存卷积后的数据
{	
	float *pRaa3;
	int n, m; 
	int leng_3; //leng_3是存放卷积完的长度
	float k=0; //k用来临时存放数据

	pRaa3 = (float *)malloc(sizeof(float)*(leng_1+leng_2-1));//动态分配内存，！没有销毁
	leng_3 = leng_1+leng_2-1;

	/* 通过离散卷积公式计算 */
	for(n=0; n<leng_3; n++)
	{
		for(m=0; m<leng_1; m++)
		{
			if((n-m)>=0 && (n-m)<leng_2)
			{
				k += pRaa1[m] * pRaa2[n-m];
			}
		}
		pRaa3[n] = k;
		k = 0; 
	}
	return pRaa3;
	free(pRaa3);
}




